package mpbe.estructura.secciones.hormigon_armado.graficos;

/*
 * Este codigo es software libre y se encuentra licenciado 
 * bajo los términos de la Licencia Pública General de GNU versión 3 
 * según se encuentra publicada por la Free Software Foundation.
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Autor: Martin Pablo Bellanca <martin.bellanca@gmail.com>
 * web: http://mpbe.blogspot.com/
 */

import mpbe.MPBE;
import mpbe.estructura.secciones.hormigon_armado.Hormigon_armado;
import mpbe.estructura.secciones.hormigon_armado.RectaUltima;
import mpbe.geometria.Limites;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Drawable;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;

public class SHDibDeformaciones {
	public DibDeformacionesDibujar DIBUJAR = null;
	public DibDeformacionesColores COLORES = null;
	
	//Seccion
	private Hormigon_armado seccion = null;
	private Limites limitesVSeccion= null;
	private Limites limitesHSeccion = null; 
	
	private double escalaX = 0; //escala del dibujo
	private double escalaY = 0; 
	private int corrimientoX; //distancia ejes globales a ejes locales de la seccion 
	private int corrimientoY;
	
	// diametros
	private int diamNodos;
	private int diamBarras;
	
	// varias
	private double decRedondeo;
	
	// Internas
	private Display display = null; //pasar como variable externa en el constructorsi no se puede obtener
	private Rectangle area = null;
	//private Drawable img = null;
	private GC gc = null;
	
	//************************************
	// Constructores
	//************************************
	public SHDibDeformaciones(Display display) {
		//Objetos a dibujar por defecto
		DIBUJAR = new DibDeformacionesDibujar();
		// colores por defecto
		COLORES = new DibDeformacionesColores();

		// diametros por defecto
		diamNodos = 8;
		diamBarras = 8;
		
		this.display = display;
		
	}
	public SHDibDeformaciones(Display display, GC gc) {
		//Objetos a dibujar por defecto
		DIBUJAR = new DibDeformacionesDibujar();
		// colores por defecto
		COLORES = new DibDeformacionesColores();

		// diametros por defecto
		diamNodos = 8;
		diamBarras = 8;
		
		this.display = display;
//		this.img = img;
		this.gc = gc;
	}
	
	
	//------------------------------------------------------------
	// Funciones de Dibujo del diagrama de deformacion
	//------------------------------------------------------------
	public boolean dibujar_Deformacion (double escalaX, double escalaY, int corrimientoX, int corrimientoY, Rectangle area){
		decRedondeo = seccion.getGenerales().uLongitud.Coef*100;
		this.escalaX = escalaX;
		this.escalaY = escalaY;
		this.corrimientoX = corrimientoX;
		this.corrimientoY = corrimientoY;
		this.area = area;

		double escDef = area.width/10;

		if (DIBUJAR.isDibDeformacionEjes()) dibDeformacionEjes(escDef);
		if (DIBUJAR.isDibDeformacionZonas()) dibDeformacionZonas(escDef);
		if (DIBUJAR.isDibDeformacionEjeN()) SHDibujar.dibEjeNeutro(gc, corrimientoX, corrimientoY, escalaY, area, display.getSystemColor(COLORES.getColorEjeNeutro()), seccion);
		if (DIBUJAR.isDibDeformacionRecLim()) dibDeformacionRecLim(escDef);
		
		return true; 
	}
	
	private void dibDeformacionEjes(double escDef){
		int dx = area.x;
		int dy = area.y;
		
		// puntos de referencia
		Limites limV = seccion.contornos.getLimitesV();
		int Xbi = dx+5;
		int Xbd = dx+area.width-5;
		int X0 = dx+SHDibujar.transformar(0, corrimientoX, escalaX);
		int X5 = dx+SHDibujar.transformar(-5, corrimientoX, escDef);
		int X2 = dx+SHDibujar.transformar(2, corrimientoX, escDef);
		int X35 = dx+SHDibujar.transformar(3.5, corrimientoX, escDef);
		int Ybs = dy+SHDibujar.transformar(limV.min, corrimientoY, escalaY);
		int Ybi = dy+SHDibujar.transformar(limV.max, corrimientoY, escalaY);
		int Yxg= dy+SHDibujar.transformar(0, corrimientoY, escalaY);
		int Yh = dy+SHDibujar.transformar(limV.max - seccion.geth(), corrimientoY, escalaY);
		
		// dibuja Ejes X
		gc.setForeground(display.getSystemColor(COLORES.getColorEjes())); 
		gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		gc.setLineWidth(1);
		gc.setLineStyle(SWT.LINE_DASHDOT);		
		
		gc.drawLine(Xbi, Yxg, Xbd, Yxg);
		gc.drawText("Xg", Xbd-8, Yxg-20);
		
		// Dibuja Ejes Y0
		gc.setLineStyle(SWT.LINE_SOLID);
		gc.setForeground(display.getSystemColor(COLORES.getColorContornos()));
		
		gc.drawLine(X0, Ybs, X0, Ybi);
		gc.drawText("0‰", X0-6, Ybs+2);
		gc.drawText("0‰", X0-6, Ybi-12);
		
		// Dibuja X 5‰
		gc.drawLine(X5, Ybs, X5, Ybi);
		gc.drawText("5‰", X5-6, Ybs+2);
		gc.drawText("5‰", X5-6, Ybi-12);
		
		// Dibuja X -2
		gc.drawLine(X2, Ybs, X2, Ybi);
		gc.drawText("-2‰", X2-6, Ybs+2);
		gc.drawText("-2‰", X2-6, Ybi-12);
		
		// Dibuja X -3.5
		gc.drawLine(X35, Ybi-3, X35, Ybi+5);
		//gc.drawText("-2‰", X2-6, Ybs+2);
		gc.drawText("-3.5‰", X35-6, Ybi-12);
		
		//borde sup e inf de la viga
		gc.drawLine(Xbi, Ybs, Xbd, Ybs);
		gc.drawLine(Xbi, Ybi, Xbd, Ybi);
		
		// Dibuja Yh
		gc.setForeground(display.getSystemColor(COLORES.getColorBarras()));
		gc.setLineWidth(2);
		gc.drawLine(Xbi, Yh, X0, Yh);
		
		
	}
	private void dibDeformacionZonas(double escDef){
		int dx = area.x;
		int dy = area.y;
		
		// puntos de referencia
		Limites limV = seccion.contornos.getLimitesV();
		//int Xbi = dx+5;
		//int Xbd = dx+area.width-5;
		int X0 = dx+SHDibujar.transformar(0, corrimientoX, escalaX);
		int X5 = dx+SHDibujar.transformar(-5, corrimientoX, escDef);
		int X2 = dx+SHDibujar.transformar(2, corrimientoX, escDef);
		int X35 = dx+SHDibujar.transformar(3.5, corrimientoX, escDef);
		int Ybs = dy+SHDibujar.transformar(limV.min, corrimientoY, escalaY);
		int Ybi = dy+SHDibujar.transformar(limV.max, corrimientoY, escalaY);
		int Yxg= dy+SHDibujar.transformar(0, corrimientoY, escalaY);
		int Yh = dy+SHDibujar.transformar(limV.max - seccion.geth(), corrimientoY, escalaY);
		
		// Propiedades de la linea
		gc.setForeground(display.getSystemColor(COLORES.getColorZonas())); 
		gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		gc.setLineWidth(1);
		gc.setLineStyle(SWT.LINE_SOLID);
		//dibuja recta 1-2
		gc.drawLine(X5, Yh, X0, Ybi);
		//dibuja recta 2-3
		gc.drawLine(X5, Yh, X35, Ybi);
		//dibuja recta 4-5
		gc.drawLine(X0, Ybs, X35, Ybi);
		
		// Dibuja Textos
		if (DIBUJAR.isDibDeformaciontxtZonas()) {
			//Define la letra
			Font font = new Font(display,"Arial",12,SWT.BOLD);
			gc.setFont(font);
			//Zona 1
			Point tamTXT = gc.stringExtent("Z1");
			gc.drawText("Z1", (X5+X0)/2-tamTXT.x/2, Ybi+10, SWT.DRAW_TRANSPARENT);
			//Zona 2
			tamTXT = gc.stringExtent("Z2");
			gc.drawText("Z2", (X0+X35)/2-tamTXT.x/2, Ybi+10, SWT.DRAW_TRANSPARENT);
			//Zona 3-4
			gc.drawText("Z3-4", (X5+X0)/2, Yh-25, SWT.DRAW_TRANSPARENT);
			//Zona 5
			tamTXT = gc.stringExtent("Z5");
			gc.drawText("Z5", (X0+X2)/2-tamTXT.x/3, Ybs-25, SWT.DRAW_TRANSPARENT);
			
			
		}	
	}
	private void dibDeformacionRecLim(double escDef){
		int dx = area.x;
		int dy = area.y;
		
		// puntos de referencia
		Limites limV = seccion.contornos.getLimitesV();		
		
		RectaUltima RU = seccion.getResultados().recta_ultima;
		double h = seccion.geth();
		int Xb = dx+SHDibujar.transformar(RU.Eb1*-1, corrimientoX, escDef);
		int Xs = dx+SHDibujar.transformar(RU.Es2*-1, corrimientoX, escDef);
		int Ybi = dy+SHDibujar.transformar(limV.max, corrimientoY, escalaY);
		int Ybs = dy+SHDibujar.transformar(limV.min, corrimientoY, escalaY);
		int Xss = (int)((Xs-Xb)/h*limV.getLongitud()+Xb);
		// dibuja Ejes X
		gc.setForeground(display.getSystemColor(COLORES.getColorRecLim())); 
		gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		gc.setLineWidth(3);
		gc.setLineStyle(SWT.LINE_SOLID);		
		
		//gc.drawLine(Xs, Yh, Xb, Ybi);
		gc.drawLine(Xss, Ybs, Xb, Ybi);
		
		// Dibuja Textos
		if (DIBUJAR.isDibDeformaciontxtRecLim()) {
			//Define la letra
			Font font = new Font(display,"Arial",10,SWT.NONE);
			gc.setFont(font);

			//Point tamTXT = gc.stringExtent(txt);//Obtiene el ancho de los cuadros de texto	
			String txt = "Es2="+MPBE.redondear(RU.Es2, 2)+"‰";
			gc.drawText(txt, Xs-12, Ybs+12, SWT.DRAW_TRANSPARENT);
			txt = "Eb1="+MPBE.redondear(RU.Eb1, 2)+"‰";
			gc.drawText(txt, Xb-12, Ybi-26, SWT.DRAW_TRANSPARENT);
		}
		
	}
	
	
	//-----------------------------------------
	// Getter y setter de diametros
	//-----------------------------------------	
	/**
	 * @return
	 * @uml.property  name="diamBarras"
	 */
	public int getDiamBarras() {
		return diamBarras;
	}
	/**
	 * @param diamBarras
	 * @uml.property  name="diamBarras"
	 */
	public void setDiamBarras(int diamBarras) {
		this.diamBarras = diamBarras;
	}

	/**
	 * @return
	 * @uml.property  name="diamNodos"
	 */
	public int getDiamNodos() {
		return diamNodos;
	}
	/**
	 * @param diamNodos
	 * @uml.property  name="diamNodos"
	 */
	public void setDiamNodos(int diamNodos) {
		this.diamNodos = diamNodos;
	}


	public Hormigon_armado getSeccion() {
		return seccion;
	}
	public void setSeccion(Hormigon_armado seccion) {
		this.seccion = seccion;
	}
	
//	public Drawable getDrawable() {
//		return img;
//	}
//	public void setDrawable(Drawable img) {
//		this.img = img;
//		this.gc = new GC(img);
//	}
	
	public GC getGC() {return gc;}
	public void setGC(GC gc) {this.gc = gc;}
	
}
